\chapter{dynare}
\section{安装}
前提条件是你安装了Matlab。然后如下进行：
\begin{itemize}
	\item 去官网https://www.dynare.org/download/下载最新的安装文件，安装好。默认情况下安装目录是\lstinline|c:\dynare\5.0|，当然可以改目录。
	\item 设置路径。“主页——设置路径”，然后“添加文件夹”(而不是“添加并包含子文件夹”)，选择\lstinline|c:\dynare\5.0\matlab|。
\end{itemize}



\section{文件结构}
这里我们首先谈文件的整体结构，然后针对该文件设置中比较复杂的部分，详细解说。Dynare文件一般包含五个部分，如下。
\begin{enumerate}
	\item 前导：声明外生变量(\lstinline|varexo e|)，内生变量(\lstinline|var c k|)，参数(\lstinline|parameters beta theta|)
	\item 模型的均衡条件：
	\begin{lstlisting}[language=matlab]
		model(linear);
		# mar_c = ...
		end;
	\end{lstlisting}
	
	注意几点：第一，\lstinline|#|是模型中的局部变量，用于变量替换，提高代码可读性；第二，注意\lstinline|model|后的是有选项的，如果选线性(\lstinline|linear|)，意味着输入的均衡条件是线性化后的均衡条件，既然是线性化后的，那稳态值自然是0.
	\item 稳态或初值声明：这一部分很重要。初值的设定有两个目的：
	\begin{itemize}
		\item 第一，是为了得到稳态值，有了稳态值才能计算各种逼近路径。但如果模型较为复杂，稳态通常难以自动得到，多数情况，建议手动编程计算稳态，然后告诉Dynare是最稳妥的。即最终把初值就设为稳态，这样稳态计算就非常快了。
		\item 第二，是为了确定性模拟提供初值。
	\end{itemize}
	\item 外生冲击声明：	
	\item 模型计算：各参数已知，稳态已得到，此时可进行三种计算：确定性模拟，随机模拟与估计。	
	\begin{lstlisting}[language=matlab]
	% 一个随机模拟的例子(意味着模拟1000次，40期，一阶求解算法)：	
		stoch_simul(periods = 1000, irf = 40, order =1);
		dynasave('simudata.mat')
	\end{lstlisting}	
\end{enumerate}
通过这五步搭建好模型以后，在matlab工作台输入如下命令即可求解运算模型，
\begin{lstlisting}[language=matlab]
dynare filename
\end{lstlisting}
\section{内生变量的分类}
\begin{table}[H]\centering
\begin{tabular}{lll}\hline
	内生变量类型& 定义& 其他\\\hline
静态变量& 只有下标$ t $&\\
前向变量& 包含下标$ t $和$ t+1 $& \\
后向变量&包含下标$ t $和$ t-1 $&如资本存量\\
混合变量& 包含下标$ t , t-1,t+1 $&\\\hline
\end{tabular}
\end{table}
因此，后向变量在冲击发生时不会发生跳跃，但前向变量会有跳跃。
\section{如何输入模型的均衡条件}
通常有三种均衡条件的输入方式：水平形式(level)，对数水平(log-level)形式和离差形式(deviation)。

离差形式是线性形式，这个当然好，但如果模型均衡条件很大，则手动线性化容易出错。因此，大规模建模时，\textbf{最好使用水平形式和对数水平形式}。


\section{确定性求解和模拟}
\subsection{初值和终值}
初值的设定是必须的，终值则只在确定性模拟中使用。所谓初值指的是0期及0期以前各期(当模型有滞后项时会涉及到0期以前各期)。终值指的是$T+1$期及后续各期。前向变量需要设定终值，后向变量需要设定初值。
\begin{figure}[H]
\includegraphics[scale=1]{dynare_init.pdf}
\caption{模拟的时期的示意图}
\end{figure}
初值设定方式如下，
\begin{lstlisting}[language=matlab]
initval;
endogenous_variables = innitial_values;
exogenous_variables = innitial_values;
end;
\end{lstlisting}
终值设定方式如下，
 \begin{lstlisting}[language=matlab]
endval;
endogenous_variables = end_values;
exogenous_variables = end_values;
end;
\end{lstlisting}

几个注意的要点：
\begin{enumerate}
	\item 若无终值设定，则\lstinline|initval|设定的初值将作为\textbf{模拟后}各期的取值(即初值即终值)；若有终值设定，则\lstinline|endval|设定的值作为\textbf{模拟后}各期的取值；
	\item 如果initval之后紧跟\lstinline|steady|命令，则\lstinline|steady|将使用\lstinline|initval|提供的初值来计算内生变量的稳态值，并将得到稳态值作为初值。
\end{enumerate}
\subsection{外生冲击}
确定性模拟和随机模拟的区别主要在于外生冲击如何设定：
\begin{itemize}
	\item 确定性模型：$ \varepsilon_{0}=0,\varepsilon_{1}=0.02,\varepsilon_{t}=0,t=2,\cdots,T $
	\item 随机性模型：$ \varepsilon_{t}\sim N(0,0.01^2),t= 0,1,\cdots,T $
\end{itemize}

冲击有几种类型:\textbf{是不是可预期的}，这个主要看外生冲击是否出现在第1期，如果是，则一般是不可预期的。不可预期的冲击一般不需要\lstinline|shock|模块进行设置。\textbf{是不是暂时性的}，这个主要看初值和终值是不是相等，如果相等，则是暂时性冲击。

确定性模拟示例：
\begin{lstlisting}[language=matlab]
shocks;
var e;
periods 1;
values 0.5;
var u;
periods 4:5;
values 0;
end;
\end{lstlisting}
随机模拟示例：
\begin{lstlisting}[language=matlab]
shocks;
var e; stderr 0.01;
var e; stderr sigma-alpha;
end;
\end{lstlisting}
设置好冲击模块以后，就可以用\lstinline|simul(periods = 98)|进行确定性模拟98期的 计算。

\section{稳态计算}
初学者很容易在这个地方卡壳。

\lstinline|steady|可以依据初值或终值来计算稳态，但这对初值和终值如何设定提出了较高的要求。一般地，对于中小规模的模型，如果稳态有解析解，或能够数值求解，一般可用自定义稳态参数或使用\lstinline|steady_state_model|命令求解。

第一种自定义稳态参数，很简单，即将解析解的稳态直接在\lstinline|parameters|模块中赋给某个变量如\lstinline|Css=...|，然后再在\lstinline|initval|模块中将该稳态直接赋给内生变量。

第二种方法，则在\lstinline|steady_state_model|模块中直接给出内生变量的解析形式，而且此处可以直接使用一些辅助变量而无需声明。

\begin{note}
\begin{itemize}
	\item 建议把随机冲击写成对数形式，否则求解稳态经常报错；
	\item 一般利用\lstinline|fsolve|来先搞定稳态；对于带参数的非线性方程求解，参见下例，这就把\lstinline|c|这个参数传进去了：
	\begin{lstlisting}[language=matlab,mathescape=false,numbers=left]
 c = -1; % define parameter first 
 x = fsolve(@(x) myfun(x,c),[-5;-5]) 
	\end{lstlisting}
	\item dynare只针对标量运算，\lstinline|mod|文件中出现向量或矩阵都会报错；
	\item dynare的模型声明块中，如果要使用自己的函数，要在之前调用\lstinline|external_function(name = nroot, nargs = 2);|函数。
	\item 代码一行写不完，直接回车即可，不需要像matlab脚本那样打三个点。
\end{itemize}
	\end{note}

\section{RBC的一个Dynare文件}
	\begin{lstlisting}[language=matlab,mathescape=false,numbers=left]
	% 内生、外生变量声明，z即为lambda
	var c k h r z y;
	varexo e;
	parameters beta delta theta A rho;
	beta = 0.99;
	delta = 0.025;
	theta = 0.36;
	A = 1.72;
	rho = 0.95;
	
	% 方便后面为求稳态的初值赋值
	parameters Hss Kss;
	Hss = 1/(1+A/(1-theta) * (1-beta*delta*theta/(1-beta*(1-delta))));
	Kss = Hss*(theta/(1/beta - 1+delta))^(1/(1-theta));
	
	model;
	1 - beta*((c/c(+1))*(r(+1)+1-delta));
	c = (1/A)*(1-h)*(1-theta)*y/h;
	k = y -c + (1-delta)*k(-1);
	y = z*(k(-1)^theta)*(h^(1-theta));
	r = theta*y/k(-1);
	log(z) = rho*log(z(-1))+e;
	end;
	
	initval;
	k = Kss;
	h = Hss;
	y = Kss^theta*Hss^(1-theta);
	c =  y - delta*Kss;
	r = theta*y/Kss;
	z = 1;
	e = 0;
	end;
	
	steady;
	resid;
	
	stoch_simul;
\end{lstlisting}